; (function () {
    // 第一遍是把小于零的去除
    // 第二遍筛选是获取第一个确实的正正整数,如果没有正整数最后一位加一
    //return
    /**
   * @param {number[]} nums
   * @return {number}
   */
    var firstMissingPositive = function (nums) {
        let arr = [0]
        nums.forEach(item => {
            if (item < 1) return
            arr[item] = item
        })

        let flag = false


        for (let index = 1; index < arr.length; index++) {

            if (!arr[index]) {
                flag = index
                break
            }

        }

        if (flag) {
            return flag
        } else {
            return arr[arr.length - 1] + 1
        }
    };

    firstMissingPositive([0])
})();

// 空间利用率O(1)
// 利用原来的数组进行标记
; (function () {
    //return
    // @lc code=start
    /**
     * @param {number[]} nums
     * @return {number}
     */
    var firstMissingPositive = function (nums) {
        // 改变所有<= 0的数变成N+1
        // （如果变为 0，后面判断就不好判断了）
        // 因为0没有正负之分, 最后的判断是通过正负号
        const N = nums.length;
        for (let i = 0; i < N; i++) {
            if (nums[i] <= 0) nums[i] = N + 1;
        }
        //遍历每个数，如果该数 |x| 属于[1,N]；把在 x-1 的位置的数加上一个负号
        for (let i = 0; i < N; i++) {
            let x = Math.abs(nums[i]);
            if (x >= 1 && x <= N) {
                nums[x - 1] = nums[x - 1] < 0 ? nums[x - 1] : -nums[x - 1];
            }
        }
        // 遍历完之后，如果全部数都是负数——答案就是 1+N，否则就是第一个正数的位置+1
        for (let i = 0; i < N; i++) {
            if (nums[i] >= 0) return i + 1;
        }
        return N + 1;
    };

    [0,3,1,-9,-10]
    [0,3,1,0,0]
    [6,3,1,6,6]
    [-6,3,-1,6,6]

})();